package FredyCRUD;

import java.sql.*;

/**
 * Clase que permite la conexión al diccionario de la BD
 * @author JF
 */
public class Conexion {
    private final String cadenaConexion = "com.mysql.jdbc.Driver";
    private final String inicioConexion = "jdbc:mysql://";
    
    private String maquina;             // dirección IP de la máquina donde reside la BD
    private String puerto;              // puerto de conexión a la BD
    private String usuario;             // usuario de la base de datos
    private String password;            // contraseña de la base de datos
    private Connection conexion;        // conexión con la base de datos
    private DatabaseMetaData metaDatos; // obtención de metadatos de DBMS
    private ResultSet resultado;        // resultado de la ejecución de la sentencia a la BD

    /**
     * Constructor por defecto de la clase
     */
    public Conexion() {
        this.maquina = "127.0.0.1";     // Máquina por defecto (locahost)
        this.puerto = "3306";           // Puerto por defecto (mySQL)
        this.usuario = "root";          // Usuario por defecto
        this.password = "";             // Sin password
    }

    /**
     * Constructor parámetros de conexión
     * @param maquina Dirección máquina destino
     * @param puerto Puerto conexión BD
     * @param usuario Username
     * @param password Contraseña
     */
    public Conexion(String maquina, String puerto, String usuario, String password) {
        this.maquina = maquina;
        this.puerto = puerto;
        this.usuario = usuario;
        this.password = password;
    }

    /**
     * Obtiene conexión a la BD
     * @return Conexión a la BD
     */
    public Connection getConexion() {
        return conexion;
    }

    /**
     * Asigna la conexión a la BD
     * @param conexion Conexión a la BD
     */
    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    /**
     * Obtiene la dirección de la máquina
     * @return Dirección de la máquina
     */
    public String getMaquina() {
        return maquina;
    }

    /**
     * Asigna la dirección de la máquina
     * @param maquina Dirección de la máquina
     */
    public void setMaquina(String maquina) {
        this.maquina = maquina;
    }

    /**
     * Obtiene la solicitud de metadados
     * @return Solicitud de metadatos
     */
    public DatabaseMetaData getMetaDatos() {
        return metaDatos;
    }

    /**
     * Asigna la solicitud de metadatos
     * @param metaDatos Solicitud de metadatos
     */
    public void setMetaDatos(DatabaseMetaData metaDatos) {
        this.metaDatos = metaDatos;
    }

    /**
     * Obtiene la contraseña de conexión
     * @return Contraseña de conexión
     */
    public String getPassword() {
        return password;
    }

    /**
     * Asigna la contraseña de conexión
     * @param password Contraseña de conexión
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Obtiene el puerto de conexión a la BD
     * @return Puerto de conexión a la BD
     */
    public String getPuerto() {
        return puerto;
    }

    /**
     * Asigna el puerto de conexión a la BD
     * @param puerto Puerto de conexión a la BD
     */
    public void setPuerto(String puerto) {
        this.puerto = puerto;
    }

    /**
     * Obtiene el set de resultados de consulta a la BD
     * @return Set de resultados de consulta a la BD
     */
    public ResultSet getResultado() {
        return resultado;
    }

    /**
     * Asigna el conjunto de resultados de consulta a la BD
     * @param resultado Conjunto de resultados de consulta a la BD
     */
    public void setResultado(ResultSet resultado) {
        this.resultado = resultado;
    }

    /**
     * Obtiene la cadena del username de la BD
     * @return Cadena del username de la BD
     */
    public String getUsuario() {
        return usuario;
    }

    /**
     * Asigna la cadena del username de la BD
     * @param usuario Cadena del username de la BD
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * Realiza conexión con el DBMS
     */
    public boolean conectar(String nombreBD) {
        String bd = (nombreBD.length() > 0) ? "/" + nombreBD : "";
        try {
            Class.forName(this.cadenaConexion);
            this.conexion = DriverManager.getConnection(
                    this.inicioConexion + this.getMaquina() + ":" + this.getPuerto() + bd, 
                    this.getUsuario(), 
                    this.getPassword());
            return true;
        } catch (ClassNotFoundException | SQLException ex) {
            return false;
        }
    }

    /**
     * Realiza la consulta al DBMS de las bases de datos disponibles
     */
    public boolean consultarBD() {
        try {
            this.metaDatos = this.conexion.getMetaData();       // Metadatos de la conexión
            this.setResultado(this.metaDatos.getCatalogs());    // Resultado de la consulta
            return true;
        } catch (SQLException ex) {
            return false;
        }
    }
    
    /**
     * Consulta las tablas de una BD
     */
    public boolean consultarTablas() {
        try {
            this.metaDatos = this.conexion.getMetaData();
            this.setResultado(this.metaDatos.getTables(null, null, null, new String[] {"TABLE"}));
            return true;
        } catch (SQLException ex) {
            return false;
        }
    }    
}
